#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

// 方法, 方法与普通函数的区别在于，方法只能被结构体、枚举或 trait 对象调用。
impl Rectangle {
    // &self 表示方法接收一个参数，该参数是结构体的一个 immutable 的引用
    //如果要修改结构体中的字段，可以使用 `&mut self`
    fn area(&self) -> u32 {
        self.width * self.height
    }
    // 多参数 函数
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }

    // 关联函数， 关联函数与普通函数的区别在于，关联函数只能通过结构体名调用，不能通过实例调用。
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    println!("The area of the rectangle is {} square pixels.", 
    // 调用方法
    rect1.area()
    );

    let rect2 = Rectangle {
        width: 10,
        height: 40,
    };

    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));

    // 调用关联函数
    let sq = Rectangle::square(3);
    println!("sq is {:?}", sq);

}